home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / stdio / RCS / ungetc.c,v < prev    next >
Text File  |  1991-12-02  |  4KB  |  164 lines

  1. head     1.3;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.3.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.3
  10. date     88.12.29.01.02.47;  author rab;  state Exp;
  11. branches 1.3.1.1;
  12. next     1.2;
  13.  
  14. 1.2
  15. date     88.12.15.09.50.20;  author ouster;  state Exp;
  16. branches ;
  17. next     1.1;
  18.  
  19. 1.1
  20. date     88.06.10.16.24.02;  author ouster;  state Exp;
  21. branches ;
  22. next     ;
  23.  
  24. 1.3.1.1
  25. date     91.12.02.20.04.23;  author kupfer;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29.  
  30. desc
  31. @@
  32.  
  33.  
  34. 1.3
  35. log
  36. @Changed return value from zero to c.
  37. @
  38. text
  39. @/* 
  40.  * ungetc.c --
  41.  *
  42.  *    Source code for the "ungetc" library procedure.
  43.  *
  44.  * Copyright 1988 Regents of the University of California
  45.  * Permission to use, copy, modify, and distribute this
  46.  * software and its documentation for any purpose and without
  47.  * fee is hereby granted, provided that the above copyright
  48.  * notice appear in all copies.  The University of California
  49.  * makes no representations about the suitability of this
  50.  * software for any purpose.  It is provided "as is" without
  51.  * express or implied warranty.
  52.  */
  53.  
  54. #ifndef lint
  55. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/ungetc.c,v 1.2 88/12/15 09:50:20 ouster Exp Locker: rab $ SPRITE (Berkeley)";
  56. #endif not lint
  57.  
  58. #include "stdio.h"
  59.  
  60. /*
  61.  *----------------------------------------------------------------------
  62.  *
  63.  * ungetc --
  64.  *
  65.  *    This procedure adds a single character back to the front of a
  66.  *    stream, so that it will be the next character read from the
  67.  *    stream.  This procedure is only guaranteed to work once in a
  68.  *    row for any stream until getc is called again.  Successive
  69.  *    calls may eventually back up to the beginning of the stream's
  70.  *    buffer, in which case future attempts to put characters back will
  71.  *    be ignored.
  72.  *
  73.  * Results:
  74.  *    EOF is returned if there was insufficient space left in the
  75.  *    buffer to push c back.  Otherwise c is returned.
  76.  *
  77.  * Side effects:
  78.  *    The stream is modified so that the next getc call for the
  79.  *    stream will return c.
  80.  *
  81.  *----------------------------------------------------------------------
  82.  */
  83.  
  84. int
  85. ungetc(c, stream)
  86.     int c;                /* Character to put back. */
  87.     register FILE *stream;        /* Stream in which to put c back. */
  88. {
  89.     if ((stream->writeCount > 0) ||
  90.         !(stream->flags & STDIO_READ) || (c == EOF) ||
  91.         (stream->status != 0)) {
  92.     return EOF;
  93.     }
  94.     if (stream->lastAccess < stream->buffer) {
  95.     if (stream->readCount != 0) {
  96.         return EOF;
  97.     }
  98.     stream->lastAccess = stream->buffer + stream->bufSize - 1;
  99.     }
  100.     if (stream->lastAccess < stream->buffer) {
  101.     stream->lastAccess = stream->buffer + stream->bufSize - 1;
  102.     stream->readCount = 0;
  103.     }
  104.  
  105.     /*
  106.      * Special case:  don't overwrite the character if it's already
  107.      * got the correct value.  This is needed during sscanf, if the
  108.      * string being scanned is read-only:  sscanf calls ungetc, but
  109.      * always puts back the same value that was already there.
  110.      */
  111.  
  112.     if (*(stream->lastAccess) != c) {
  113.     *(stream->lastAccess) = c;
  114.     }
  115.     stream->lastAccess--;
  116.     stream->readCount++;
  117.     stream->flags &= ~STDIO_EOF;
  118.     return c;
  119. }
  120. @
  121.  
  122.  
  123. 1.3.1.1
  124. log
  125. @Initial branch for Sprite server.
  126. @
  127. text
  128. @d17 1
  129. a17 1
  130. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/ungetc.c,v 1.3 88/12/29 01:02:47 rab Exp $ SPRITE (Berkeley)";
  131. @
  132.  
  133.  
  134. 1.2
  135. log
  136. @Don't modify the buffer during ungetc unless absolutely necessary:
  137. needed to support read-only string buffers.
  138. @
  139. text
  140. @d17 1
  141. a17 1
  142. static char rcsid[] = "$Header: ungetc.c,v 1.1 88/06/10 16:24:02 ouster Exp $ SPRITE (Berkeley)";
  143. d37 1
  144. a37 1
  145.  *    buffer to push c back.
  146. d80 1
  147. a80 1
  148.     return 0;
  149. @
  150.  
  151.  
  152. 1.1
  153. log
  154. @Initial revision
  155. @
  156. text
  157. @d17 1
  158. a17 1
  159. static char rcsid[] = "$Header: atoi.c,v 1.1 88/04/28 17:20:23 ouster Exp $ SPRITE (Berkeley)";
  160. d66 11
  161. a76 1
  162.     *(stream->lastAccess) = c;
  163. @
  164.